package templateMethod;

/**
 * 重写一个方法系统自动帮我们调用的例如动态代理，都可以称之为TemplateMethod 模版方法。
 * 牵扯到钩子函数 模版函数都叫templateMethod
 * 核心就是你定义好了模版 实现了不用手动调用模版就调用了
 */
public class TemplateMethod {
    public static void main(String args[]){
        System.out.println("TemplateMethod");

        Template template = new C();
        template.call();
    }
}

abstract class Template{
    // 定义模版方法
    public void call(){
        opt1();
        opt2();
    }

    abstract void opt1();
    abstract void opt2();
}

/**
 * 谁用模版 call 谁去实现
 * 定义好了opt1
 * opt2
 * 不需要手动调用由模版函数调用
 */
class C extends Template{

    @Override
    void opt1() {
        System.out.println("opt1");
    }

    @Override
    void opt2() {
        System.out.println("opt1");
    }
}